home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et3_0-a1.lha / et3 / src / CONTAINER / ObjList.h < prev    next >
C/C++ Source or Header  |  1992-06-11  |  3KB  |  129 lines

  1. #ifndef ObjList_First
  2. #ifdef __GNUG__
  3. //pragma once
  4. #pragma interface
  5. #endif
  6. #define ObjList_First
  7.  
  8. #include "SeqColl.h"
  9.  
  10. //---- ObjLink -----------------------------------------------------------------
  11.  
  12. class ObjLink: public Object {
  13. friend class ObjList;
  14. friend class ObjListIter;
  15. friend class RevObjListIter;
  16. protected:
  17.     ObjLink()
  18.     { op= 0; next= this; prev= this; } 
  19. public:
  20.     MetaDef(ObjLink);
  21.     ObjLink(Object *a, ObjLink *ll);
  22.     
  23.     void FreeAll();
  24.     
  25.     Object *Op()
  26.     { return op; }
  27.     ObjLink *Next()
  28.     { return next; }
  29.     ObjLink *Prev()
  30.     { return prev; }
  31.     
  32.     //---- memory allocation
  33.     void *operator new(size_t sz)
  34.     { return Storage::ObjectChunkAlloc(sz); }
  35.     void operator delete(void *vp)
  36.     { Storage::ObjectChunkFree(vp); }
  37.  
  38. private:
  39.     ObjLink *next, *prev;
  40.     Object *op;
  41. };
  42.  
  43. //---- ObjList -----------------------------------------------------------------
  44.  
  45. class ObjList: public SeqCollection {
  46. friend class ObjListIter;
  47. friend class RevObjListIter;
  48. public:
  49.     MetaDef(ObjList);    
  50.     ObjList();
  51.     ~ObjList();
  52.     
  53.     void InitNew();
  54.     void Empty(int);
  55.     void FreeAll();
  56.     
  57.     //---- manipulation
  58.     Object *Add(Object *op);
  59.     Object *AddAt(Object *op, int idx);
  60.     Object *AddBefore(Object *op, Object *after);
  61.     Object *AddBeforePtr(Object *op, Object *after);
  62.     Object *AddAfter(Object *op, Object *before);
  63.     Object *AddAfterPtr(Object *op, Object *before);
  64.     Object *PutAt(Object *op, int idx);
  65.     Object *Remove(Object *op);
  66.     Object *RemovePtr(Object *op);
  67.     Object *RemoveLast();
  68.     Object *RemoveAt(int i);
  69.     
  70.     //---- accessing
  71.     Iterator *MakeIterator(bool dir= cIterForward);
  72.     Object *At(int i);
  73.     Object *Before(Object *after);
  74.     Object *BeforePtr(Object *after);
  75.     Object *After(Object *before);
  76.     Object *AfterPtr(Object *before);
  77.     Object *First();
  78.     Object *Last();
  79.     Object *Find(Object *op);
  80.     Object *FindPtr(Object *op);
  81. protected:
  82.     //---- primitives
  83.     ObjLink *FindLink(Object *op, bool eq);
  84.     Object *DoInsertBefore(Object *before, Object *op, bool eq, char *name);
  85.     Object *DoInsertAfter(Object *after, Object *op, bool eq, char *name);
  86.     
  87.     ObjLink *DoMakeLink(Object *op, ObjLink *ll);
  88.     ObjLink *LinkAt(int i);
  89.     void InsertLink(Object *op, ObjLink *ll); 
  90.     void RemoveLink(ObjLink *ll);
  91. protected:
  92.     ObjLink *anchor;  
  93. };
  94.  
  95. //---- class ObjListIter ------------------------------------------------------
  96.  
  97. class ObjListIter: public Iterator {
  98. friend class ObjList;   // due to ATT 2.0, 2.1 for passing a IteratorMethod
  99. public:
  100.     ObjListIter(ObjList *s);
  101.     ~ObjListIter();
  102.     
  103.     Object* operator()();    
  104.     void Reset();    
  105. protected:
  106.     Container *GetContainer();
  107.     void AboutToEmpty(void *pix);
  108.     void AboutToAdd(void *pix);
  109.     void AboutToRemove(void *pix);
  110. protected:
  111.     ObjList *list;
  112.     ObjLink *ce;        // current element
  113. };
  114.  
  115. //---- class RevObjListIter ---------------------------------------------------
  116.  
  117. class RevObjListIter: public ObjListIter {
  118. public:
  119.     RevObjListIter(ObjList *s);
  120.     
  121.     Object* operator()();    
  122. protected:
  123.     void AboutToRemove(void *pix);
  124. };
  125.  
  126. //-----------------------------------------------------------------------------
  127.  
  128. #endif ObjList
  129.